//
//  HttpRequestManager.swift
//  StealPicture
//
//  Created by 郭斌勇 on 16/8/15.
//  Copyright © 2016年 ?! 郭斌勇. All rights reserved.
//

import UIKit


let 共享session = NSURLSession.sharedSession()


let boundary = "boundary-StealPicture-GuoBinYong"
let 数据开始边界 = "--" + boundary + "\r\n"
let 数据结束边界 = "--" + boundary + "--" + "\r\n"

//MARK:HTTP请求

func get请求(urlStr:String,参数:[String:String]?,响应成功:((数据:AnyObject?,响应:NSURLResponse?)->Void)?,响应失败:((错误:NSError)->Void)? ){
    
    var 完整urlStr = urlStr
    
    if let 参数字典 = 参数 {
        完整urlStr = 完整urlStr + "?" + 拼接成stringWith(参数字典)
    }
    
    
    if let url = NSURL(string: 完整urlStr){
        
        let dataTask = 共享session.dataTaskWithURL(url, completionHandler: {
            (data:NSData?,response:NSURLResponse?,error:NSError?) in
            
            if (error != nil) && (响应失败 != nil) {
                响应失败!(错误: error!)
                return
            }
            
            guard let 解封_响应成功 = 响应成功 else{
                return
            }
            
            guard let 解封data = data,
                let 结果数据 = try? NSJSONSerialization.JSONObjectWithData(解封data, options: .AllowFragments)
                else{
                    解封_响应成功(数据:nil,响应:response)
                    return
            }
            
            解封_响应成功(数据: 结果数据, 响应:response)
            
        })//共享session
        
        dataTask.resume()
        
    }else{
        print("-------URL解析错误:\(urlStr)-------")
    }
    
    
    
    
}




func post请求(urlStr:String,参数:[String:String]?,响应成功:((数据:AnyObject?,响应:NSURLResponse?)->Void)?,响应失败:((错误:NSError)->Void)? ){
    
    
    
    guard let url = NSURL(string: urlStr)else{
        print("-------URL解析错误:\(urlStr)-------")
        return
    }
    
    
    let 可变request = NSMutableURLRequest(URL:url)
    可变request.HTTPMethod = "POST"
    
    if let 解封_参数 = 参数{
        let 字符串参数 = 拼接成stringWith(解封_参数)
        可变request.HTTPBody = 字符串参数.dataUsingEncoding(NSUTF8StringEncoding)
    }
    
    
    let dataTask = 共享session.dataTaskWithRequest(可变request, completionHandler: {
        (data:NSData?,response:NSURLResponse?,error:NSError?)->Void in
        
        
        
        if (error != nil) && (响应失败 != nil) {
            响应失败!(错误: error!)
            return
        }
        
        guard let 解封_响应成功 = 响应成功 else{
            return
        }
        
        guard let 解封data = data,
            let 结果数据 = try? NSJSONSerialization.JSONObjectWithData(解封data, options: .AllowFragments)
            else{
                解封_响应成功(数据:nil,响应:response)
                return
        }
        
        解封_响应成功(数据: 结果数据, 响应:response)
        
        
        
        
        
    })
    
    
    dataTask.resume()
    
    
}





func post下载(urlStr:String,参数:[String:String]?,响应成功:((数据:AnyObject?,响应:NSURLResponse?)->Void)?,响应失败:((错误:NSError)->Void)? ){
    
    
    
    guard let url = NSURL(string: urlStr)else{
        print("-------URL解析错误:\(urlStr)-------")
        return
    }
    
    
    let 可变request = NSMutableURLRequest(URL:url)
    可变request.HTTPMethod = "POST"
    
    if let 解封_参数 = 参数{
        let 字符串参数 = 拼接成stringWith(解封_参数)
        可变request.HTTPBody = 字符串参数.dataUsingEncoding(NSUTF8StringEncoding)
    }
    
    
    let downloadTask = 共享session.downloadTaskWithRequest(可变request, completionHandler: {
        (文件位置:NSURL?,response:NSURLResponse?,error:NSError?)->Void in
        
        
        
        if (error != nil) && (响应失败 != nil) {
            响应失败!(错误: error!)
            return
        }
        
        guard let 解封_响应成功 = 响应成功 else{
            return
        }
        
        guard let 解封位置 = 文件位置,
            let 结果数据 = try? NSJSONSerialization.JSONObjectWithData(NSData(contentsOfURL:解封位置)!, options: .AllowFragments)
            else{
                解封_响应成功(数据:nil,响应:response)
                return
        }
        
        解封_响应成功(数据: 结果数据, 响应:response)
        
        
        
        
        
    })
    
    
    
    
    
    downloadTask.resume()
    
    
}








func image请求(urlStr:String,响应成功:((image:UIImage?,响应:NSURLResponse?)->Void)?,响应失败:((错误:NSError)->Void)? ){
    
    
    
    
    if let url = NSURL(string: urlStr){
        
        let dataTask = 共享session.dataTaskWithURL(url, completionHandler: {
            (data:NSData?,response:NSURLResponse?,error:NSError?) in
            
            if (error != nil) && (响应失败 != nil) {
                响应失败!(错误: error!)
                return
            }
            
            guard let 解封_响应成功 = 响应成功 else{
                return
            }
            
            guard let 解封data = data,
                let 结果image = UIImage(data: 解封data)
                else{
                    解封_响应成功(image: nil, 响应: response)
                    return
            }
            
            
            解封_响应成功(image: 结果image, 响应: response)
            
        })//共享session
        
        dataTask.resume()
        
    }else{
        print("-------URL解析错误:\(urlStr)-------")
    }
    
    
    
    
}




func image下载(urlStr:String,响应成功:((image:UIImage?,响应:NSURLResponse?)->Void)?,响应失败:((错误:NSError)->Void)? ){
    
    
    
    
    if let url = NSURL(string: urlStr){
        
        let downloadTask = 共享session.downloadTaskWithURL(url, completionHandler: {
            (文件位置:NSURL?,response:NSURLResponse?,error:NSError?)->Void in
            
            if (error != nil) && (响应失败 != nil) {
                响应失败!(错误: error!)
                return
            }
            
            guard let 解封_响应成功 = 响应成功 else{
                return
            }
            
            
            
            guard let 解封位置 = 文件位置,
                let 结果image = UIImage(data: NSData(contentsOfURL:解封位置)!)
                else{
                    解封_响应成功(image: nil, 响应: response)
                    return
            }
            
            
            解封_响应成功(image: 结果image, 响应: response)

            
        })
        
        
        downloadTask.resume()
        
    }else{
        print("-------URL解析错误:\(urlStr)-------")
    }
    
    
    
    
}






func 上传jpeg图片(urlStr:String,参数:[String:String],name:String,filename:String,图片:UIImage,响应成功:((数据:AnyObject?,响应:NSURLResponse?)->Void)?,响应失败:((错误:NSError)->Void)?){
    
    let url = NSURL(string: urlStr)
    var muRequest = NSMutableURLRequest(URL: url!)
    
    muRequest.HTTPMethod = "POST"
    muRequest.setValue("multipart/form-data; boundary="+boundary, forHTTPHeaderField: "Content-Type")
// muRequest.setValue("application/octet-stream; boundary="+boundary, forHTTPHeaderField: "Content-Type")
    var bodyData = NSMutableData()
    
    
    //添加参数数据
    for (key,value) in 参数 {
        
        let 参数_内容配置str = "Content-Disposition: form-data; name=\"\(key)\"" + "\r\n"
        let 参数_值str = "\r\n" + value + "\r\n"
        
        let 参数完整表示str  = 数据开始边界 + 参数_内容配置str + 参数_值str
        
        bodyData.appendData(参数完整表示str.dataUsingEncoding(NSUTF8StringEncoding)!)
    }
    
    
    //添加图片数据
    
    let 图片_内容配置str = "Content-Disposition: form-data; name=\"\(name)\"; filename=\"\(filename)\"\r\n"
    let 图片_内容类型str = "Content-Type: image/jpeg" + "\r\n" + "\r\n"
    
    let 图片数据_前str = 数据开始边界 + 图片_内容配置str + 图片_内容类型str
    
    bodyData.appendData(图片数据_前str.dataUsingEncoding(NSUTF8StringEncoding)!)
    bodyData.appendData(UIImageJPEGRepresentation(图片, 0.5)!)
    let 图片数据_后str = "\r\n"
    bodyData.appendData(图片数据_后str.dataUsingEncoding(NSUTF8StringEncoding)!)
    
    
    //添加body结束符
    bodyData.appendData(数据结束边界.dataUsingEncoding(NSUTF8StringEncoding)!)
    
    
    
    
    
    let uploadTask = 共享session.uploadTaskWithRequest(muRequest, fromData: bodyData, completionHandler: {
        (返回data:NSData?, response:NSURLResponse?, error:NSError?) -> Void in
        
//        let 返回str = String(data: 返回data!, encoding: NSUTF8StringEncoding)
//        
//        
//        print("---上传图片----返回的数据:",返回str!)
//        print("---上传图片----返回的response:",response!)
//        print("----上传图片---返回错误:",error)
        
        if (error != nil) && (响应失败 != nil) {
            响应失败!(错误: error!)
            return
        }
        
        guard let 解封_响应成功 = 响应成功 else{
            return
        }
        
        guard let 解封data = 返回data,
            let 结果数据 = try? NSJSONSerialization.JSONObjectWithData(解封data, options: .AllowFragments)
            else{
                解封_响应成功(数据:nil,响应:response)
                return
        }
        
        解封_响应成功(数据: 结果数据, 响应:response)
        
    })
    
    uploadTask.resume()
    
}







//MARK:辅助函数


func 拼接成stringWith(被拼接的字典:[String:String])->String{
    
    var 拼接的字符串 = ""
    var 第1个 = true
    
    for (key,value) in 被拼接的字典 {
        if 第1个 {
            拼接的字符串 = key + "=" + value
            第1个 = false
        }else{
            拼接的字符串 = 拼接的字符串 + "&" + key + "=" + value
        }
        
    }
    
    return 拼接的字符串
}



